/**
 * ------------------------------------------------------------------
 * Copyright reserved by Emin Technology
 * ---- --------------------------------------------------------------
 * <p>
 * PROJECT:		Base
 * FILE:			BaseService.java
 * AUTHOR:		sunny
 * DATE CREATION:2011-12-05
 * DESCRIPTION:	base service
 * <p>
 * ==========================================================
 * VERSION CONTROL
 * Number – Date – Author – SVN – Description
 * 01 –  2011-12-05 – sunny – xxx – base service
 * -------------------------------------------------------------------------------------------------------
 */
package top.jle.jpa.basic.service;

import top.jle.jpa.basic.dao.*;
import top.jle.jpa.basic.entities.Entity;

import java.util.List;
import java.util.Set;


public interface CRUDService<T extends Entity> {

    void setEntityDao(EntityDao entityDao);

	void setClazz(Class<T> clazz);

    /**
     * 获得操作实体的class
     * @return
     */
	Class<T> getEntityClass();

    /**
     * 获取对象代理(用于保存/更新xxxToOne关系)
     * @param id object's id
     *
     * @return
     */
	T getReferenceById(long id);

    /**
     * 批量获取对象代理(用于保存/更新xxxToMany关系)
     * @param ids
     *            object's ids
     *
     * @return
     */
	Set<T> getReferencesByIds(Long[] ids);

    /**
     * 根据id获取实体
     * @param id
     * 			object's id
     *
     * @return
     */
	T findById(Long id);

    /**
     * 根据排序要求获取实体列表
     * @param sortKeys 不传,传null或new SortKey[]{}空数组,均按默认id降序处理
     *
     * @return
     */
	List<T> findAll(SortKey... sortKeys);

    /**
     * 根据过滤条件获取实体列表(默认id降序)
     * @param preFilters 属性过滤条件
     *
     * @return
     */
	List<T> findByPreFilter(PreFilter... preFilters);

    /**
     * 根据排序要求和过滤条件获取实体列表(默认id降序)
     * @param sortKeys 传null或new SortKey[]{}空数组,均默认id降序处理
     * @param preFilters 属性过滤条件
     *
     */
	List<T> findByPreFilter(SortKey[] sortKeys, PreFilter... preFilters);


    /**
     * 获取满足过滤条件的唯一一个实体
     * @param preFilters 属性过滤条件
     *
     * @return
     */
	T findUniqueByPreFilter(PreFilter... preFilters);

    /**
     * 查找实体对象的list并返回,通过class和id的数组
     * @param ids
     *            objects' ids
     *
     * @return List of Entity
     */
    List<T> findByIds(Long[] ids);

    /**
     * 根据分页请求的设置和过滤条件,获得用户权限可见的分页结果(默认id降序),
     * 此方法用户信息从ThreadLocal中共享的信息中获取]
     * @param pageRequest 分页查询参数
     * @param preFilter 属性过滤器
     * @return {@link PagedResult}
     */
    PagedResult<T> getPage(PageRequest pageRequest, PreFilter... preFilter);

    /**
     * 查询指定类型的实体数量
     *
     * @return count of entities
     */
    int getAllCount();

    int getCountByPreFilter(PreFilter... preFilter);

    int getCountByPreFilters(PreFilter... preFilter);

    boolean existsByPreFilter(PreFilter... preFilter);

    void update(T entity);


    void delete(T entity);


    void deleteById(Long id);


    void deleteByIds(Long[] ids);


    /**
     * 保存实体对象
     *
     * @param entity 需要保存的实体对象
     */
	void save(T entity);

    void saveOrUpdate(T entity);


    /**
     * 刷新session
     */
	void flush();

}
